<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>const</title>
</head>
<body>
    <script>
        /**
         * const声明的变量不得改变值，
         * 这意味着，const一旦声明变量，就必须立即初始化，不能留到以后赋值。
        */

        const PI =3.14;

        /**
         * const其他的地方和let类似，块级作用域，暂时性死区
        */

        /**
         * const实际上保证的，并不是变量的值不得改动，而是变量指向的那个内存地址所保存的数据不得改动。
         * 对于简单类型的数据（数值、字符串、布尔值），值就保存在变量指向的那个内存地址，因此等同于常量。
         * 但对于复合类型的数据（主要是对象和数组），变量指向的内存地址，保存的只是一个指向实际数据的指针，
         * const只能保证这个指针是固定的（即总是指向另一个固定的地址），至于它指向的数据结构是不是可变的，就完全不能控制了。因此，将一个对象声明为常量必须非常小心。
        */

        const arr =[1,2,3,4,5];
        arr[0]=12;

         const user ={
             name: "Tom",
         }
         user.name = "Lily";

         /**如果真的想将对象冻结，应该使用Object.freeze方法。*/

         /**不仅对象要冻结，对象的属性也要冻结*/
         Object.freeze(user);
         Object.freeze(user.name);
         user.name ="Halo";
         console.log(user.name);

         /**不管是使用let还是使用const都不会把变量绑定到window上*/
    </script>
</body>
</html>